終於到第一次開始實做 Real World problem 了!!!
這裡我們會透過 Kaggle competition 來了解 Polynomial Regression 如何應用。
Kaggle 是一個專門提供給資料科學領域的競賽平台。在參加這次競賽前請先註冊帳號。
這裡我們會參加這個競賽,這也是入門Kaggle中最經典的一個競賽,主要目標就是預測 Titanic 上的乘客生還得可能性,算是一種 Binary classification 的任務,非常適合透過這次所介紹的 Polynomial Regression 來解決問題。
import pandas as pd
import numpy as np
train_data = pd.read_csv('/kaggle/input/titanic/train.csv')
test_data = pd.read_csv('/kaggle/input/titanic/test.csv')
# Select relevant columns and drop rows with missing values
train_data = train_data[['Pclass', 'Sex', 'Age', 'Fare', 'Survived']].dropna()
test_data = test_data[['Pclass', 'Sex', 'Age', 'Fare']]
# Convert 'Sex' column to numeric values (e.g., Male: 0, Female: 1)
train_data['Sex'] = train_data['Sex'].map({'male': 0, 'female': 1})
test_data['Sex'] = test_data['Sex'].map({'male': 0, 'female': 1})
# Separate features and target for training data
X_train = train_data[['Pclass', 'Sex', 'Age', 'Fare']].values
y_train = train_data['Survived'].values
這裡主要是透過 Kaggle notebook 開發,所以在其他地方開發的讀取資料集的路徑 pd.read_csv
要更改一下。
我們所要使用的 feature 僅有 'Pclass', 'Sex', 'Age', 'Fare', 'Survived'
這些 column,當然其他 column 也可以使用。
要注意的是 Polynomial Regression 所需要的資料必須是數值形式,所以在性別的 Male 和 Female 我們分別對應到 0 和 1。
輸入項 x 是 'Pclass', 'Sex', 'Age', 'Fare'
,而輸出項 y 則是 'Survived'
。
這裡所使用到的 function 跟昨天一樣。
不過這次需要另一個 function StandardScaler
class CustomStandardScaler:
def __init__(self):
self.mean = None
self.std = None
def fit(self, X):
self.mean = np.mean(X, axis=0)
self.std = np.std(X, axis=0)
def transform(self, X):
if self.mean is None or self.std is None:
raise ValueError("Scaler has not been fitted. Call fit() before transform().")
X_normalized = (X - self.mean) / self.std
return X_normalized
def fit_transform(self, X):
self.fit(X)
return self.transform(X)
透過此函式,餵入的數據將會進行標準化(Z-Score),並呈現正態分佈,其中標準化後的數據集平均值為0標準差為1
其中是需要被標準化的原始數值,是母體的平均,是母體的標準差。
class CustomFeatureTransformer:
def __init__(self, degree, is_bias=True):
self.is_bias = is_bias
self.degree = degree
def transform(self, x = None):
if x is None:
raise ValueError('x is None')
if self.is_bias:
x = np.c_[np.ones(x.shape[0]), x]
for i in range(2, self.degree + 1):
x = np.c_[x, x[:, 1] ** i]
return x
def fit_transform(self, x):
return self.transform(x)
class CustomLinearRegression:
def __init__(self):
self.w = None
def fit(self, x, y):
self.w = np.linalg.inv(x.T.dot(x)).dot(x.T).dot(y)
def predict(self, x):
return x.dot(self.w)
def score(self, x, y):
y_pred = self.predict(x)
return 1 - ((y - y_pred)**2).sum() / ((y - y.mean())**2).sum()
透過 Polynomial Regression 我們可以得到百分比大約 75~77 的準確率。
當然這個競賽不僅能使用 Polynomial Regression,透過 KNN 或是 Support Vector Machine 或其他模型都可以完成並也可以得到相似或更好的結果。
完整的 code 可以看 Github 或是去 Kaggle Notebook 實際執行喔~
明天要進入另一個主題 Naive Bayes Classifier 敬請期待
歡迎更仔細閱讀以下相關內容以了解本篇知識